package opensnap.service;
import opensnap.*;
import opensnap.domain.User;
import opensnap.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.*;
import java.util.concurrent.CompletableFuture;
@Service
public class DefaultUserService implements UserService {
private UserRepository userRepository;
private SimpMessagingTemplate template;
private PasswordEncoder passwordEncoder;
@Autowired
public DefaultUserService(PasswordEncoder passwordEncoder, UserRepository userRepository) {
this.userRepository = userRepository;
this.passwordEncoder = passwordEncoder;
}
@Autowired
public void setTemplate(SimpMessagingTemplate template) {
this.template = template;
}
@Override
public CompletableFuture<User> create(User user) {
Assert.hasLength(user.getUsername());
Assert.hasLength(user.getPassword());
CompletableFuture<User> futureUser = userRepository.count("username", user.getUsername()).thenCompose((count) -> {
Assert.isTrue(count == 0, "User " + user.getUsername() + " already exists!");
user.setPassword(passwordEncoder.encodePassword(user.getPassword(), null));
return userRepository.insert(user);
});
futureUser.thenAccept(createdUser -> template.convertAndSend(Topic.USER_CREATED, createdUser.withoutPasswordAndRoles()));
return futureUser;
}
@Override
public CompletableFuture<User> signup(User user) {
user.setRoles(Arrays.asList("USER"));
return create(user);
}
@Override
public CompletableFuture<List<User>> getAllUsers() {
return userRepository.getAll();
}
@Override
public CompletableFuture<User> getByUsername(String username) {
return userRepository.getOne("username", username);
}
@Override
public CompletableFuture<Boolean> exists(String username) {
return userRepository.count("username", username).thenApply(count -> count > 0);
}
}